package pl.edu.pw.elka.tinyrepo.dataserver.server;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

import pl.edu.pw.elka.tinyrepo.common.Request;
import pl.edu.pw.elka.tinyrepo.common.RequestHandler;
import pl.edu.pw.elka.tinyrepo.gate.server.GateFacade;

/**
 * Klasa bazowa dla request handlerow w Data Server.
 * Kazdy request handler w DS posiada dostep do socketa oraz 
 * requesta, ktory ma byc obsluzony przez handlera. 
 * 
 * @author Piotr Jarosik
 */
abstract class DataServerRequestHandler implements RequestHandler {
   /** Socket do klienta.*/
   Socket incomming;
   /** Request od klienta. Klasa bazowa serwerow zapewnia, ze w momencie wywolania
    *  uruchomienia metody run socket jest poprawny (tzn. nie jest null). */
   Request request;
   /** Root katalog dla serwera danych. */
   File dataCatalog;
   /** Uchwyt do bramy. */
   GateFacade gate;
   
   /**
    * Funkcja przepompowujaca dnae z out do in, przy uzyciu bufora o podanym rozmiarze.
    * 
    * @param out
    * @param in
    * @param bufferSize
    * @throws IOException 
    */
   static void writeBytes(OutputStream out, InputStream in, Integer bufferSize) throws IOException {
      byte[] buffer = new byte[bufferSize]; 
      int amount = 0; // ile sie wczytalo do bufora
      
      // UWAGA! przy wysylaniu danych nie nalezy uzwac BufferedReadera - bo dodaje kodowanie znakow do poszczegolnych bajtow, i plik po drugiej stronie jest uszkodzony
      // trzeba korzystac z niskopoziomowych wartosci
      
      while((amount = in.read(buffer)) != -1) // pobieraj porcje o rozmiarze bufora, az dojdziesz do konca
         out.write(buffer, 0, amount); // wyslij bufor do klienta.
      out.flush(); 
   }
   
   @Override
   public void setSocket(Socket incomming) {
      this.incomming = incomming;
   }

   @Override
   public void setRequest(Request r) {
      request = r;
   }

   @Override
   public Request getRequest() {
      return request;
   }
}
